1 Definica do Problema

A partir dos dados disponibilizados … é possivel aplicar diferentes abordagens nesses dados…

1.1 Descricao do problema

Problema para prever o salário de um cientista de dados

Y = salário de um cientista de dados

  • Dados anonimizados

1.2 Dados Fornecidos

# read dataset
dataset <- read_csv("datahackers-survey-2019-anonymous-responses.csv")

# fix colnames
dataset <- 
  dataset %>% 
  janitor::clean_names()

# quantidade de opcoes por pergunta (ordenado do maior para o menor)
(
  MORE_QUESTIONS <- 
    dataset %>% 
    colnames() %>%
    str_extract("(p|d)[0-9]{1,}") %>% 
    table() %>% 
    .[.>1] %>% 
    sort(decreasing = T)
)
## .
## p26 p20 p27 p21 p28 p33 p30 p34 p23 p24 p25 p31 p35 
##  24  21  16  13  12  11  10  10   7   7   7   6   2
# Perguntas com mais de 1 resposta:
names(MORE_QUESTIONS)
##  [1] "p26" "p20" "p27" "p21" "p28" "p33" "p30" "p34" "p23" "p24" "p25" "p31"
## [13] "p35"
MORE_QUESTIONS <- MORE_QUESTIONS[names(MORE_QUESTIONS) != "p35"] 

# Quantidade de respostas ordenada
dataset %>% 
  select(str_which(colnames(dataset), paste0(names(MORE_QUESTIONS), collapse = "|"))) %>%
  map_df(sum) %>% 
  gather() %>% 
  arrange(-value) %>% 
  separate(key, c("pergunta", "resposta"),  "_", extra = "merge")
## # A tibble: 144 x 3
##    pergunta resposta             value
##    <chr>    <chr>                <dbl>
##  1 p31      data_hackers_blog     1195
##  2 p34      udemy                 1125
##  3 p31      data_hackers_podcast  1096
##  4 p33      youtube_channels      1014
##  5 p31      weekly_newsletter      878
##  6 p23      sql                    834
##  7 p21      python                 784
##  8 p33      abroad_blogs           780
##  9 p33      meetups_and_events     762
## 10 p23      sheets                 758
## # … with 134 more rows
  • pesquisa foi conduzida de forma online durante o mês de Novembro de 2019
  • dataset foi anonimizado
  • remover alguns outliers que poderiam identificar o entrevistado e, portanto, nem todos os dados coletados na pesquisa estarão disponíveis aqui
  • Estados com menor incidência de resposta, como aqueles das regiões Norte, Nordeste e Centro-Oeste terão apenas sua região indicada no dataset (tambem como consequencia da anonimização)
  • As perguntas cujas respostas são multi-valoradas ocupam mais de uma coluna no dataset
  • Categorias foram convertidas para dummie

Pode ser conferida em: https://www.kaggle.com/datahackers/pesquisa-data-hackers-2019

Perguntas realizadas e pré-seleção de atributos para previsão de salário:

Indice Pergunda Seleção
P1 Idade? [Mascarada]
P2 Gênero? [Mascarada]
P3 Atualmente você vive no Brasil?
P4 Em que país você vive hoje?
P5 Em que estado você vive hoje? [Mascarada]
P6 Na questão anterior você disse que vive em. Esse é seu estado de origem (onde nasceu ou se formou)?
P7 Qual seu estado de origem?
P8 Qual seu nível de ensino?
P9 Qual sua área de formação?
P10 Qual sua situação atual de trabalho?
P11 A empresa em que você trabalha pertence a qual setor?
P12 A empresa em que você trabalha possui quantos funcionários atualmente?
P13 Você atua como gestor?
P14 Qual das opções abaixo definem melhor seu cargo de trabalho atual como gestor?
P15 Qual das opções abaixo definem melhor seu cargo de trabalho atual?
P16 Qual sua faixa salarial atual? [Mascarada]
P17 Quanto tempo de experiência na área de dados você tem?
P18 Quanto tempo de experiência na área de TI/Engenharia de Software você teve antes de começar a trabalhar na área de dados?
P19 Você se considera um profissional que atua na área de Data Science?
P20 Quais dos métodos listados abaixo você costuma utilizar no trabalho?
P21 Quais das linguagens de programação listadas abaixo você utiliza no trabalho?
P22 Entre as linguagens de programação listadas abaixo, qual é a que você mais utiliza no trabalho? [Mascarada]
P23 Quais das fontes de dados listadas você já analisou no trabalho?
P24 Entre as fontes de dados listadas, quais você utiliza na maior parte do tempo? Selecione no máximo duas opções que você mais utiliza.
P25 Quais das opções de Cloud listadas abaixo você utiliza no trabalho?
P26 Quais dos bancos de dados/fontes de dados listados abaixo você utiliza para consultar informações, e posteriormente analisar, no trabalho?
P27 Quais as Ferramentas de Business Intelligence você utiliza no trabalho?
P28 Quais as tecnologias são utilizadas como ferramenta de ETL no seu trabalho?
P29 Sua organização possui um Data Warehouse?
P30 Qual tecnologia utilizada como plataforma do Data Warehouse?
P31 Quais das iniciativas do Data Hackers que você já acessou/acompanhou?
P32 Entre as iniciativas do Data Hackers qual a sua preferida?
P33 De quais outras formas que você costuma se atualizar no mundo dos dados?
P34 Em quais dessas plataformas listadas abaixo você já iniciou/completou cursos na área de Data Science?
P35 Dentre as plataformas listadas abaixo qual foi a sua preferida para cursos de Data Science?

Além dessas, derivamos algumas outras colunas:

Indice Pergunda Seleção
D1 Macrorregião em que mora
D2 Macrorregião em que nasceu
D3 Área de formação anonimizada
D4 Setor de mercado anonimizado
D5 Nível de gerência anonimizado
D6 Cargo anonimizado

Filtros:

  • Moradores do Brasil
  • Pessoas que estejam no mercado
# Conferir quem sao os individuos que nao declararam o salario:
dataset %>% 
  count(p10_job_situation, p16_salary_range) %>% 
  filter(is.na(p16_salary_range))
## # A tibble: 5 x 3
##   p10_job_situation                             p16_salary_range     n
##   <chr>                                         <chr>            <int>
## 1 Desempregado e não estou buscando recolocação <NA>                 3
## 2 Desempregado, buscando recolocação            <NA>                69
## 3 Somente Estudante (graduação)                 <NA>                85
## 4 Somente Estudante (pós-graduação)             <NA>                36
## 5 Trabalho na área Acadêmica/Pesquisador        <NA>                45
# remover estes individuos do dataset:
dataset <- 
  dataset %>% 
  filter(p3_living_in_brasil == 1) %>% 
  filter(!is.na(p16_salary_range))
# Converter para fator ordenado
dataset <- 
  dataset %>% 
  mutate(p16_salary_range = factor(p16_salary_range, 
                                   levels = c("Menos de R$ 1.000/mês",
                                              "de R$ 1.001/mês a R$ 2.000/mês",
                                              "de R$ 2.001/mês a R$ 3000/mês",
                                              "de R$ 3.001/mês a R$ 4.000/mês",
                                              "de R$ 4.001/mês a R$ 6.000/mês",
                                              "de R$ 6.001/mês a R$ 8.000/mês",
                                              "de R$ 8.001/mês a R$ 12.000/mês",
                                              "de R$ 12.001/mês a R$ 16.000/mês",
                                              "de R$ 16.001/mês a R$ 20.000/mês",
                                              "de R$ 20.001/mês a R$ 25.000/mês",
                                              "Acima de R$ 25.001/mês")))

# before fix y
p1 <- 
  plotly::ggplotly(
    dataset %>% 
      count(p16_salary_range) %>% 
      ggplot(aes(x= p16_salary_range, y = n))+
      geom_bar(stat = "identity") +
      theme(axis.text.x = element_text(angle = 60, vjust = 1, hjust = 1))
  )


# Agregar salarios com menor frequencia
dataset <- 
  dataset %>% 
  mutate(p16_salary_range = as.character(p16_salary_range),
         p16_salary_range = 
           case_when(
             p16_salary_range == "Menos de R$ 1.000/mês" ~ "Menos de R$ 2.000/mês",
             p16_salary_range == "de R$ 1.001/mês a R$ 2.000/mês" ~ "Menos de R$ 2.000/mês",
             p16_salary_range == "de R$ 2.001/mês a R$ 3000/mês" ~ "de R$ 2.001/mês a R$ 3.000/mês",
             p16_salary_range == "de R$ 12.001/mês a R$ 16.000/mês" ~ "Acima de R$ 12.001/mês",
             p16_salary_range == "de R$ 16.001/mês a R$ 20.000/mês" ~ "Acima de R$ 12.001/mês",
             p16_salary_range == "de R$ 20.001/mês a R$ 25.000/mês" ~ "Acima de R$ 12.001/mês",
             p16_salary_range == "Acima de R$ 25.001/mês" ~ "Acima de R$ 12.001/mês",
             TRUE ~ as.character(p16_salary_range)),
         p16_salary_range = 
           factor(p16_salary_range, 
                  levels = c("Menos de R$ 2.000/mês",
                             "de R$ 2.001/mês a R$ 3.000/mês",
                             "de R$ 3.001/mês a R$ 4.000/mês",
                             "de R$ 4.001/mês a R$ 6.000/mês",
                             "de R$ 6.001/mês a R$ 8.000/mês",
                             "de R$ 8.001/mês a R$ 12.000/mês",
                             "Acima de R$ 12.001/mês")))

# after fix y
p2 <- 
  plotly::ggplotly(
    dataset %>% 
      count(p16_salary_range) %>% 
      ggplot(aes(x= p16_salary_range, y = n))+
      geom_bar(stat = "identity") +
      theme(axis.text.x = element_text(angle = 60, vjust = 1, hjust = 1))
  )

plotly::subplot(p1, p2)

1.3 Motivacao

  • Motivacao
  • Beneficios
  • Uso

2 Resumir/Analisar Dados

# create_report(dataset, y = "p16_salary_range")

introduce(dataset) %>% gather()
## # A tibble: 9 x 2
##   key                    value
##   <chr>                  <dbl>
## 1 rows                    1506
## 2 columns                  170
## 3 discrete_columns          19
## 4 continuous_columns       151
## 5 all_missing_columns        0
## 6 total_missing_values    6277
## 7 complete_rows              0
## 8 total_observations    256020
## 9 memory_usage         2238584
plot_intro(dataset)

plot_missing(dataset, missing_only = T)

2.1 Estatisticas descritivas:

visdat::vis_dat(dataset)

dataset %>% 
  map_dbl(~sum(is.na(.x))) %>% 
  .[.!=0] %>% 
  {tibble(pergunta = names(.), n = .)} %>% 
  arrange(-n)
## # A tibble: 13 x 2
##    pergunta                                   n
##    <chr>                                  <dbl>
##  1 p35_other                               1385
##  2 d2_origin_macroregion                   1220
##  3 d5_anonymized_manager_level             1205
##  4 p29_have_data_warehouse                  815
##  5 p22_most_used_proggraming_languages      732
##  6 d6_anonymized_role                       272
##  7 p5_living_state                          234
##  8 d1_living_macroregion                    234
##  9 p35_data_science_plataforms_preference   121
## 10 d3_anonymized_degree_area                 32
## 11 p1_age                                    21
## 12 d4_anonymized_market_sector                4
## 13 p36_draw_participation                     2
  • Distribuicoes dos dados
  • summary, VarType, Corr Matrix, Count os class labels

2.2 Visualizacoes

histogramas, densidades, boxplots, dispersao, matrix de correlacoes

3 Preparar dados

3.1 Selecao de Atributos

3.2 Limpeza dos dados

Formato, Limpeza, Amostragem

3.3 Testar suposiçoes

Normalidade, igualdades, etc

3.4 Transformacao dos dados

Scale, decomposicao, agregacao

4 Avaliar agoritmos

4.1 Separar dados de treino/validacao/teste

4.2 Testar opcoes e metricas de avaliacao

Por nivel de dificuldade (do mais facil para o mais dificil):

  1. knn, naive-bayes,
  2. logit, decision tree, lasso, elasticnet, svm,
  3. randomforest, gbm, xgboost, nnet
  4. h2o::automl

4.3 Algoritmos de verificação

baseline

4.4 Comparar algoritmos

metricas, proporcao de dados (palavras) utilizadas, tempo de processamento, tempo de estimacao etc

5 Melhorar a acuracia

5.1 Tunning algoritmos

grid search

5.2 Conjuntos (Ensembles)

modelo hibrido?

bagging, boosting, blending

“extreme feature engineering”

6 Finalizar modelo

Contexto Problema Solucao Achados Limitacoes Conclusoes

6.1 Previsoes no dataset de teste

6.2 Salvar modelo para deploy / Operacionalizar algoritmo

Shiny?